package com.dongnao.network.netty_hashcat;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;

/**
 * @author sjy
 * @date 2024年05月13日 17:03
 */
public class NettyStarter {

    public static void main(String[] args) {

        //创建BossGroup 和WorkerGroup
        //1.创建两个线程组bossGroup和 workerGroup
        //2.bossGroup只是处理连接请求，真正的和客户端业务处理，会交给 workerGroup完成
        //3．两个都是无限循环
        //4.bossGroup和 workerGroup含有的子线程(NioEventLoop)的个数默认为cpu核数*2
        NioEventLoopGroup bossGroup = new NioEventLoopGroup(1);
        NioEventLoopGroup workerGroup = new NioEventLoopGroup();//不指定的话个数默认为cpu核数*2

        try {
            //ServerBootStrap本质上是一个容器，放置各种网络服务配置，然后组合起来
            ServerBootstrap bootstrap = new ServerBootstrap();

            //链式编程设置配置信息
            bootstrap.group(bossGroup, workerGroup)//设置两个线程组
                    .channel(NioServerSocketChannel.class)//使用NioServerSocketChannel作为服务器通道的实现
                    .option(ChannelOption.SO_BACKLOG, 1024)//设置线程队列的连接个数//设置服务端可连接队列大小
                    .childOption(ChannelOption.SO_KEEPALIVE, true)//设置保持活动的连接个数
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new WebServerInit());

            System.out.println("服务器启动完成...");
            //api是基于异步的事件驱动，需要做同步
            ChannelFuture cf = bootstrap.bind(8899).sync();
            System.out.println("ChannelFuture: " + cf);

            //对关闭通道进行监听//等待服务端channel关闭
            cf.channel().closeFuture().addListeners(future -> {
                //释放资源
                bossGroup.shutdownGracefully();
                workerGroup.shutdownGracefully();
            });
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}
